加载中...
avatar

CentOS7 部署文件服务器
CentOS7 部署文件服务器

参考

背景知识
  • FTP是仅基于TCP的服务,不支持UDP。

  • 与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。

  • FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

  • 主动模式是从服务器端向客户端发起连接;被动模式是客户端向服务器端发起连接。

  • 大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。

  • vsftpd有以下三种认证模式:

    • 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登陆。

    • 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来简单。

    • 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令
      验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。

  • 主被动模式另类说明:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    FTP 主/被动模式的原理:
    --------------------------------------------------------------------------------
    FTP 是 File Transfer Protocol (文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于 HTTP,FTP 协议要
    复杂得多。复杂的原因,是因为 FTP 协议要用到两个 TCP 连接,一个是命令链路,用来在 FTP 客户端与服务器之间传递命令;
    另一个是数据链路,用来上传或下载数据。FTP 协议有两种工作方式:PORT 方式和 PASV 方式,中文意思为主动式和被动式。

    PORT(主动)方式的连接过程是:
    --------------------------------------------------------------------------------
    客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需
    要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的
    XXXX端口发送连接请求,建立一条数据链路来传送数据。

    PASV(被动)方式的连接过程是:
    --------------------------------------------------------------------------------
    客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需
    要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口
    发送连接请求,建立一条数据链路来传送数据。

    概括:
    --------------------------------------------------------------------------------
    主动模式:服务器向客户端敲门,然后客户端开门
    被动模式:客户端向服务器敲门,然后服务器开门
    所以,如果你是如果通过代理上网的话,就不能用主动模式,因为服务器敲的是上网代理服务器的门,而不是敲客户端的门
    而且有时候,客户端也不是轻易就开门的,因为有防火墙阻挡,除非客户端开放大于1024的高端端口

安装 vsftp
  • 安装

    1
    yum install -y vsftpd
  • 安装 db4,db4-devel,db4-utils

    1
    yum -y install db4*
  • 备份配置文件

    1
    cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

虚拟用户模式配置
  • 查看如何配置配置文件: man vsftpd.conf

  • 创建用于FTP认证的用户数据库文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    1. vim /etc/vsftpd/vuser.txt

    注:第一行用户名,第二行密码,依此类推

    sftpadmin
    公司通用加强密码
    ftpuser2
    algoblu@299

    2. 明文信息不安全,需要使用db_load命令用哈希(hash)算法将明文信息转换成数据文件,然后将明文信息文件删除。
    # db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
    # chmod 600 /etc/vsftpd/vuser.db
    # rm -f /etc/vsftpd/vuser.txt
  • 创建虚拟用户映射的系统本地用户和 FTP 根目录

    1
    2
    3
    4
    5
    6
    useradd -d /home/vftp -s /sbin/nologin vftp
    chmod -Rf 755 /home/vftp/

    映射用户:vftp
    FTP 根目录:/home/vftp
    不允许shell登录:/sbin/nologin
  • 建立用于支持虚拟用户的 PAM 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    1. 新建一个用于虚拟用户认证的 PAM 文件 vsftpd.pam,其中 PAM 文件内的 “db=” 
    参数为使用 db_load 命令生成的账户密码数据文件的路径,但不用写数据文件的后缀。

    vuser.db
    vim /etc/pam.d/vsftpd.pam
    auth required pam_userdb.so db=/etc/vsftpd/vuser
    account required pam_userdb.so db=/etc/vsftpd/vuser

    2. 为两个虚拟用户设置不同的权限,ftpuser1 拥有所有权限,而 ftpuser2 只有读取权限。
    mkdir /etc/vsftpd/vusers_dir

    vim /etc/vsftpd/vusers_dir/sftpadmin
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES

    vim /etc/vsftpd/vusers_dir/ftpuser2 只有读取权限,只创建文件,限定目录,不作其他配置
    local_root=/home/vftp/Algoblu/ # 限定 ftpuser2 访问的根目录为 /home/vftp/Algoblu/ ,默认为 /home/vftp/
  • 修改配置文件,删除之前的匿名模式配置内容,带注释 # 的是需要修改和新增的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    vim /etc/vsftpd/vsftpd.conf

    anonymous_enable=NO # 不允许匿名登录
    anon_umask=022
    local_enable=YES
    guest_enable=YES # 开启虚拟用户模式
    guest_username=vftp # 指定虚拟用户对应的系统用户
    allow_writeable_chroot=YES # 允许对 FTP 根目录执行写入操作
    write_enable=YES
    local_umask=022
    local_root=/home/vftp # 指定根目录
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen_port=2231
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd.pam # 指定 PAM 文件
    userlist_enable=YES # -- 不允许 userlist 中的用户连接
    tcp_wrappers=YES
    user_config_dir=/etc/vsftpd/vusers_dir # 指定虚拟用户配置文件目录
    pasv_min_port=45000
    pasv_max_port=49000

    配置解释
    # vi /etc/vsftpd/vsftpd.conf
    anonymous_enable=no //禁用匿名用户登录
    (anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_umask=022 //指定上传权限掩码)

    local_enable=YES //需映射本地用户,所以启用些项
    write_enable=YES //启用上传写入支持
    chroot_local_user=YES //(自建配置)将所有本地用户限制在家目录中
    guest_enable=YES //启用映射功能
    guest_username=tom //指定映射的系统用户名称
    pam_service_name=juser.pam //指定新的PAM认证文件
    user_config_dir=/opt/vsftpd/juser_dir //(自建配置)设置虚拟帐号的主目录为/juser_dir
    max_clients=300 //(自建配置)设置FTP服务器最大接入客户端数为300个
    max_per_ip=10 //(自建配置)设置每个IP地址最大连接数为10个
    listen=YES
    port_enable=NO //(自建配置)取消PORT模式进行数据传输
    connect_from_port_20=NO //(修改配置)PORT模式进行数据传输部使用20端口
    ftp_data_port=20
    pasv_enable=YES //(自建配置)允许PASV模式进行数据传输
    pasv_min_port=65341 //(自建配置)PASV模式下数据传输所使用port范围下界
    pasv_max_port=65351 //(自建配置)PASV模式下数据传输所使用port范围上界
  • 重启 vsftpd 服务

    1
    systemctl restart vsftpd

配置防火墙
1
2
3
4
5
6
7
8
9
10
11
12
13
firewall-cmd --zone=public --add-port=2231/tcp --permanent
firewall-cmd --zone=public --add-port=45000-49000/tcp --permanent
firewall-cmd --reload

注意:
防火墙不添加第二行(vsftpd中对应的端口范围)将出现错误:
命令: LIST
错误: 20 秒后无活动,连接超时
错误: 读取目录列表失败


查看已开放的端口:
firewall-cmd --list-ports

配置自启动服务
  • 命令行输入 setup

  • 选择 System services

  • 选择对应的服务即可


测试
  • 查看线程是否存在:ps aux | grep vsftpd

  • 查看监听的端口:netstat -tlunp

  • 使用FTP 工具 Filezilla 访问服务器

  • 使用 Windows 建立网络位置:

    • 计算机 -> 网络位置 -> 右键,添加一个网络位置 -> 选择自定义网络位置 ->
    • -> Internet 地址或者网络地址:ftp://192.168.100.12:2231
    • -> 取消匿名登录 -> 输入用户名 -> 取一个名称 …
  • 使用浏览器 ftp://192.168.100.12:2231


常见问题
  • 错误:读取目录列表失败

    • 解决:参见防火墙配置
  • 上传文件失败

    • 检查目录是否有写权限
    • 检查登录的账户是否有写权限
  • SFTP连接时很慢

    • 因为默认开启了reverse_lookup(反向解析)
    • man vsftpd.conf : reverse_lookup_enable
    • 默认为 YES, 在 /etc/vsftpd/vsftpd.conf 中天加
      1
      reverse_lookup_enable=NO
文章作者: 卖报小行家
文章链接: https://saitamata.github.io/2019/09/09/%E6%95%99%E7%A8%8B/%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8/CentOS7%20%E9%83%A8%E7%BD%B2%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 卖报小行家
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论